<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Acl_Library
 *
 * @author Dellano
 */
require_once 'util/TipoUsuarioEnum.php';

class Core_Acl extends Zend_Acl{
    //put your code here
   // protected static $_cache = null;

    

    public function  __construct ()
    {
       $this->adicionarResources();

       $this->adicionarRoles();

       $this->garantirPermissoes();

    }

    /* adiciona os resources utilizados pelos usuarios do
     * site
     */
    private function adicionarResources ()
    {
         // resources para o crud de produto
        $this->add (new Zend_Acl_Resource ('produtos'));

        $this->add (new Zend_Acl_Resource ('adicionar'), 'produtos');

        $this->add (new Zend_Acl_Resource ('editar'), 'produtos');

        $this->add (new Zend_Acl_Resource ('deletar'), 'produtos');

        $this->add (new Zend_Acl_Resource ('index'));



    }

    /*
     * adiciona os roles de usuarios do site
     */
    private function adicionarRoles ()
    {
         //adicionando roles
        $this->addRole (new Zend_Acl_Role ('usuario'));

        $this->addRole (new Zend_Acl_Role ('admin'), 'usuario');

        $this->addRole (new Zend_Acl_Role ('membro'), 'usuario');

    }

    private function garantirPermissoes ()
    {
         //adicionando permissoes
        $this->allow ('usuario', 'index');

        $this->allow ('admin', 'produtos');

        $this->allow ('admin', 'index', 'encomendar');

        $this->allow ('admin', 'produtos', 'adcionar');

        $this->allow ('admin', 'produtos', 'editar');

        $this->allow ('admin', 'produtos', 'deletar');

        //$this->deny('membro', $resources)
    }

    public function getRoleName ($id_tipo_usuario)
    {
        
        switch ($id_tipo_usuario)
        {
           
            case TipoUsuarioEnum::Administrador :
                $user = 'admin';
                break;
            case TipoUsuarioEnum::Membro :
                $user = 'membro';
                break;
            default :
                $user = 'usuario';
                break;

        }

        return $user;
    }

   
  
//
//    public static function cache()
//    {
//        if( is_null(self::$_cache) ){
//            $cacheDir = APPLICATION_CACHE_DIR;
//            $frontend = array(
//                'lifetime' => 7200,
//                'automatic_serialization' => true
//            );
//
//            $backend = array(
//                'cache_dir' => $cacheDir
//            );
//            self::$_cache = Zend_Cache::factory('Core', 'File', $frontend, $backend);
//        }
//        return self::$_cache;
//    }
//
//    public static function cacheClean()
//    {
//        $cache = self::cache();
//        $cache->clean(Zend_Cache::CLEANING_MODE_ALL);
//    }
//
//    public static function cacheSave($name, Zend_Acl $acl)
//    {
//        $cache = self::cache();
//        $cache->save($acl, $name);
//    }
//
//    public static function cacheLoad($name)
//    {
//        $cache = self::cache();
//        return $cache->load($name);
//    }
//
//    public function setConfig( Zend_Config $config )
//    {
//        $this->setOptions($config->toArray());
//    }
//
//    public function setOptions( array $options )
//    {
//        if ( isset($options['resources']) ){
//            $this->addResources( $options['resources'] );
//            unset( $options['resources'] );
//        }
//
//        if( isset($options['roles']) ){
//            $this->addRoles( $options['roles'] );
//            unset( $options['roles'] );
//        }
//
//        $allowed = array(
//            'Allow', 'Deny'
//        );
//
//        foreach ( $options as $key => $value ){
//            $normalized = ucfirst($key);
//            if ( !in_array( $normalized, $allowed ) ){
//                continue;
//            }
//
//            $method = 'set' . $normalized;
//            if (method_exists($this, $method)){
//                $this->$method($value);
//            }
//        }
//    }
//
//    public function addResources( array $resources )
//    {
//        foreach( $resources as $source ){
//            $resource = $source['resource'];
//            $parent   = isset($source['parent']) ? $source['parent'] : null;
//            $this->addResource( new Zend_Acl_Resource($resource), $parent );
//        }
//    }
//
//    public function addResource(Zend_Acl_Resource_Interface $resource, $parent = null)
//    {
//        return $this->add($resource, $parent);
//    }
//
//    public function addRoles( array $roles )
//    {
//        foreach( $roles as $source )
//        {
//            $role    = $source['role'];
//            $inherit = isset($source['inherit']) ? $source['inherit'] : null;
//            $this->addRole(new Zend_Acl_Role($role), $inherit);
//        }
//    }
//
//    public function setAllow( array $allow )
//    {
//        foreach( $allow as $source )
//        {
//            $role       = (array) $source['role'];
//            $resource   = $source['resource'];
//            $privileges = array_key_exists('privileges', $source) ? (array) $source['privileges'] : null;
//
//            $class = null;
//            if( array_key_exists('assert', $source) )
//            {
//                if( $class  = $source['assert'] ){
//                    if( !class_exists( $assert ) ){
//                        throw new Zend_Acl_Exception(sprintf('Class %s does not exist', $class));
//                    }
//                }
//            }
//            $assert = $class ? new $class : $class;
//            $this->allow($role, $resource, $privileges, $assert);
//        }
//    }
//
//    public function setDeny( array $deny )
//    {
//        foreach( $deny as $source ){
//            $role       = (array) $source['role'];
//            $resource   = $source['resource'] ? (array) $source['resource'] : null;
//            $privileges = array_key_exists('privileges', $source) ? (array) $source['privileges'] : null;
//
//            $class = null;
//            if( array_key_exists('assert', $source) ){
//                if( $class  = $source['assert'] ){
//                    if( !class_exists( $assert ) ){
//                        throw new Zend_Acl_Exception(sprintf('Class %s does not exist', $class));
//                    }
//                }
//            }
//
//            $assert = $class ? new $class : $class;
//            $this->deny($role, $resource, $privileges, $assert);
//        }
//    }

  
}

